<?php
class APagoProveedor {

	public function __construct() {
	}

	public function generacionPago(EFacade & $facade) {
		$ezpdo_=getManager();
		$session=$facade->session;
		$docPP = & $facade->getDocumentRoot();
		$listaProductos=$docCP->listaProductos;
		$network=$docPP->workflowRef->networkRef;
		$query='FROM MConfiguracionCuenta as t WHERE t.documento.oid=?';
		$configuracion=$ezpdo_->find($query,$network->epGetObjectId());
		$cuentas=$configuracion[0]->cuenta;
		$totalCompra=$docPP->totalAPagar;
		foreach($cuentas as $c){
			if($c->posicion==1){
				$c->cuentaContable->disminuye($totalCompra,$docPP);
				$c->cuentaContable->commit();
			}
		}
		$proveedor=&$docPP->proveedor;
		if($proveedor->cuenta==NULL){
			$cuentaProveedor=$session->create('MCuentaProveedor');
			$proveedor->cuenta=$cuentaProveedor;
		}
		if($docPP->cuentaPorPagar!=0){
			
			$query1='FROM MCuentaContable as t WHERE t.oid=?';
			$cuentaHja=$ezpdo_->find($query1,$docPP->cuentaPorPagar);
			$cuentaHja[0]->disminuye($docPP->totalAPagar,$docPP);
			$cuentaHja[0]->commit();	
		}
		$cuentaProveedor=&$proveedor->cuenta;
		$listaCuotas=&$cuentaProveedor->cuotasProveedor;
		$saldoProveedor=$proveedor->cuenta->getSaldo();
		$cuentaProveedor->commit();
		$listaFacturas=&$cuentaProveedor->facturasProveedor;
		$listaFacturas[]=$docPP;
		$totalPagado=0;
		$formasPago=$docPP->listaFormaPagoList;
		foreach($formasPago as $formaPago){
			$montoImpuesto=0;
			//$montoPagado=stringToNumber($formaPago->montoPago);
			$montoPagado=$formaPago->montoPago;
			$totalPagado+=$montoPagado;
			if($cuentaCaja=&$formaPago->formaPago->cuentaCaja!=NULL){
				$saldoCajaViejo=$cuentaCaja->saldo;
				$sql='FROM MTipoTransaccion as t where t.cuentaCaja.oid = ?';
				$transacciones=$ezpdo_->find($sql,$cuentaCaja->epGetObjectId());
				$tipoTransaccion=$transacciones[0];
				$montoAumento=0;
				if($porcentaje=$tipoTransaccion->porcentajeComision>0){
					$montoNuevo=$montoPagado*$porcentaje/100;
					$montoImpuesto-=$montoNuevo;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$montoNuevo;
					$transaccion->esCaja=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Comision  ".$porcentaje ." %";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->montoComision >0){
					$montoImpuesto-=$porcentaje;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$porcentaje;
					$transaccion->esCaja=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Comision  ".$porcentaje ." BsF";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->porcentajeImpuesto >0){
					$montoNuevo=$montoPagado*$porcentaje/100;
					$montoImpuesto-=$montoNuevo;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$montoNuevo;
					$transaccion->esCaja=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Impuesto ".$porcentaje ." %";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->montoImpuesto >0){
					$montoImpuesto-=$porcentaje;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$porcentaje;
					$transaccion->esCaja=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Impuesto ".$porcentaje ." BsF";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				$transaccion=$session->create('MTransaccion');
				$fechaTransaccion=time();
				$montoTransaccion=$montoPagado;
				$transaccion->esCaja=TRUE;
				$transaccion->fechaTransaccion=$fechaTransaccion;
				$transaccion->montoTransaccion=$montoTransaccion;
				$transaccion->debe=$montoTransaccion;
				$detalle=" con ".$formaPago->formaPago->nombre." ".$formaPago->detalle;
				$descripcion=$docPP->proveedor->nombre.". Pago a Proveedor ".$detalle;
				$transaccion->descripcion=$descripcion;
				$transaccion->tipoTransaccion=$tipoTransaccion;
				$transaccion->cuentaCaja=$cuentaCaja;
				$transaccion->documento=$docPP; 
				$saldoCajaNuevo=$saldoCajaViejo-$montoPagado+$montoImpuesto;
				$cuentaCaja->saldo=$saldoCajaNuevo;
				$transaccion->saldoCuenta =$saldoCajaNuevo;
				$cuentaCaja->cuentaContable->disminuye($montoPagado,$docPP);
				$transaccion->commit();
				$cuentaCaja->commit();
			} else {
				$cuentaCaja=&$formaPago->formaPago->cuentaBancaria;
				$saldoCajaViejo=$cuentaCaja->saldo;
				$sql='FROM MTipoTransaccion as t where t.cuentaBancaria.oid = ?';
				$transacciones=$ezpdo_->find($sql,$cuentaCaja->epGetObjectId());
				$tipoTransaccion=$transacciones[0];
				$montoAumento=0;
				if($porcentaje=$tipoTransaccion->porcentajeComision>0){
					$montoNuevo=$montoPagado*$porcentaje/100;
					$montoImpuesto-=$montoNuevo;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$montoNuevo;
					$transaccion->esBanco=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Comision  ".$porcentaje ." %";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->montoComision >0){
					$montoImpuesto-=$porcentaje;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$porcentaje;
					$transaccion->esBanco=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Comision  ".$porcentaje ." BsF";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->porcentajeImpuesto >0){
					$montoNuevo=$montoPagado*$porcentaje/100;
					$montoImpuesto-=$montoNuevo;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$montoNuevo;
					$transaccion->esBanco=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Impuesto ".$porcentaje ." %";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if($porcentaje=$tipoTransaccion->montoImpuesto >0){
					$montoImpuesto-=$porcentaje;
					$transaccion=$session->create('MTransaccion');
					$fechaTransaccion=time();
					$montoTransaccion=$porcentaje;
					$transaccion->esBanco=TRUE;
					$transaccion->fechaTransaccion=$fechaTransaccion;
					$transaccion->montoTransaccion=$montoTransaccion;
					$transaccion->debe=$montoTransaccion;
					$descripcion="Impuesto ".$porcentaje ." BsF";
					$transaccion->descripcion=$descripcion;
					$transaccion->tipoTransaccion=$tipoTransaccion;
					$transaccion->cuentaCaja=$cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				$transaccion=$session->create('MTransaccion');
				$fechaTransaccion=time();
				$montoTransaccion=$montoPagado+$montoImpuesto;
				$transaccion->esBanco=TRUE;
				$transaccion->fechaTransaccion=$fechaTransaccion;
				$transaccion->montoTransaccion=$montoTransaccion;
				$transaccion->debe=$montoTransaccion;
				$detalle=" con ".$formaPago->formaPago->nombre." ".$formaPago->detalle;
				$descripcion=$docPP->proveedor->nombre.". Pago a Proveedor ".$detalle;
				$transaccion->descripcion=$descripcion;
				$transaccion->tipoTransaccion=$tipoTransaccion;
				$transaccion->cuentaBanco=$cuentaCaja;
				$transaccion->documento=$docPP;
				$saldoCajaNuevo=$saldoCajaViejo-$montoPagado+$montoImpuesto;
				$cuentaCaja->saldo=$saldoCajaNuevo;
				$transaccion->saldoCuenta = $saldoCajaNuevo;
				$cuentaCaja->cuentaContable->disminuye($montoPagado,$docPP);
				$transaccion->commit();
				$cuentaCaja->commit();
			}
		}
		$totalAPagar=stringToNumber($docPP->totalAPagar);
		$saldoProveedorNuevo=$saldoProveedor-$totalAPagar;
		$cuentaProveedor->saldo=$saldoProveedorNuevo;
		/************** Cuenta Proveedor ***********************/
		$historico = $session->create('MListaHistoricoCuentas');
		$historico->fecha = date('U');
		$historico->saldo = $saldoProveedorNuevo;
		$historico->debito = $docPP->totalAPagar;
		$docPP->commit();
		$docPP->numero = $docPP->getDocumentNumber();		
		$historico->referencia = 'Pago a Proveedor. '.$docPP->concepto;
		$historico->cuentaProveedor = $cuentaProveedor;
		$historico->documento = $docPP;
		$historico->commit();
		/************************************************/
		$cuentaProveedor->commit();
		$proveedor->cuenta->commit();
		$listaCuotas=&$docPP->listaCuotaProveedorList;
		$fechaPago=time();
		$role=NULL;
		foreach($listaCuotas as &$listaCuota){
			$listaCuota->fechaPago=$fechaPago;
			$cuota=&$listaCuota->cuotaProveedor;
			$montoCuota=$cuota->getMontoCuota();
			$montoPago=$listaCuota->totalPago;
			$montoRestante=$montoCuota-$montoPago;
			$cuota->abono=$montoPago;
			$cuota->fechaUltimoPago=$fechaPago;
			if($montoRestante==0){
				$cuota->status=TRUE;
			}
			$cuota->commit();
			$docF=$cuota->factura;
			if($docF!=NULL){
				$newEfacade =& EFacade :: initWorkflow($facade->session, $docF, & $role);
				$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /*PROCESS */ 3);
				if($transSetOT){
				$transOT = $transSetOT->getTransByName('t4');
				$usuario=NULL;
				$newEfacade->fireTrans($transOT, $usuario, "actualizar",TRUE);
				$docF->epSetDirty(TRUE);
				$newEfacade->saveWorkflow();
				}
				$docF->commit();
				unset($newEfacade);
				$facade->session->evictAll('MEdge');
				$facade->session->evictAll('MTrans');
				$facade->session->evictAll('MPlace');
			}
		}
		foreach($listaCuotas as &$listaCuota){
			$docP=$cuota->prestamoDeExterno;
			$role = null;
			if ($docP!=NULL){
				$facade->session->refresh($docP);
				$newEfacade = & EFacade :: initWorkflowWithoutRole($facade->session, $docP, /*process*/3);
				$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* PROCESS */3);
				if($transSetOT){
					$transOT = $transSetOT->getTransByName('t3');
					$usuario=NULL;
					$newEfacade->fireTrans($transOT, $usuario, "actualizar",TRUE);
					$docP->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
					$newEfacade->saveWorkflow();
				}
				$docP->commit();
				unset($newEfacade);
				$facade->session->evictAll('MEdge');
				$facade->session->evictAll('MTrans');
				$facade->session->evictAll('MPlace');
			} 
		}
		if($docPP->listaNotaCreditoProveedorList){
			foreach($docPP->listaNotaCreditoProveedorList as & $lista){
				$nota = & $lista->notaCreditoProveedor;
				$nota->importeTotal = $nota->importeTotal - $lista->monto;
				$nota->epSetDirty(TRUE);
				
				$nota->commit();
			}
		}	
		$workflowPP = & $docPP->getWorkflowRef();
		$facade->session->refresh($workflowPP);
		$transSetPP = & EFacade :: getCurrentTransSetAuto($workflowPP, /* AGENT */	2);
		$transPP = & $transSetPP->getTransByName('t2');
		$user=NULL;
		$facade->fireTrans($transPP, $user, 'Pago a Proveedor', FALSE);
		$workflowPP->epSetDirty(TRUE);
		$docPP->epSetDirty(TRUE);
		$facade->saveWorkflow();	
	}
	
	public function totalPagos(EFacade & $facade) {
		$docPP = & $facade->getDocumentRoot();
		$todoPago=TRUE; 
		$workflowPP = & $docPP->getWorkflowRef();
		$facade->session->refresh($workflowPP);
		$transSetPP = & EFacade :: getCurrentTransSetAuto($workflowPP, /* AGENT */	2);
		if($todoPago){
			$transPP = & $transSetPP->getTransByName('t6');
		}
		else {
			$transPP = & $transSetPP->getTransByName('t5');
		}
		$user=NULL;
		$facade->fireTrans($transPP, $user, 'Verificación de pago completo', FALSE);
		$workflowPP->epSetDirty(TRUE); 
		$docPP->epSetDirty(TRUE); 
		$facade->saveWorkflow();	
	}
}
?>